package educar.models;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import educar.db.JPA;

public class Materia {
  private int codigo;
  private String nombre;
  private int dniDocente;
  private Docente docenteResponsable;
  private ArrayList<Docente> plantelDocente;
  private ArrayList<Alumno> alumnosInscriptos;
  private ArrayList<Actividad> actividades;
  private static JPA jpa = new JPA();
	
  /**
   * 
   * @param cod "codigo de la materia"
   * @param nuevoNombre "nombre de la materia"
   * @param dniDocente "dni del docente responsable de la materia"
   */
  public Materia(int cod, String nuevoNombre, int dniDocente){
	codigo=cod;
	nombre=nuevoNombre;
	this.dniDocente = dniDocente;
  }
	
  /**
   * @return codigo "codigo de la materia"
   */
  public int getCodigo(){
    return codigo;
  }
	
  /**
   * @return nombre "nombre de la materia"
   */
  public String getNombre(){
    return nombre;
  }
	
  /**
   * @return dniDocente "dni del docente responsable de la materia"
   */
  public int getDniResponsable(){
    return dniDocente;
  }
	
  /**
   * @return docenteResponsable "docente responsable de la materia " 
   */
  public Docente getDocenteResponsable(){
    return docenteResponsable;
  }
	
  /**
   * @return aux "ArrayList de docentes"
   */
  public ArrayList<Docente> getPlantelDocente(){
	ArrayList<Docente> aux=new ArrayList<Docente>();
	for(int i=0;i<plantelDocente.size(); i++)
	  aux.add(plantelDocente.get(i));
	  aux.add(docenteResponsable);
	  return aux;
  }
  
  /**
   * @return alumnosInscriptos "lista(ArrayList) de los alumnos inscriptos en una materia"
   */
  public ArrayList<Alumno> getAlumnosInscriptos(){
	return alumnosInscriptos;
  }
	
  /**
   * @return actividades "lista(ArrayList) de las actividades de una materia"
   */
  public ArrayList<Actividad> getActividades(){
	return actividades;
 }
	
  /**
   *Agrega un docente a la lista de docentes
   * @param d "docente de una materia"
   */
  public void addDocente(Docente d){
    plantelDocente.add(d);
  }
	
  /**
   * Agrega un alumno a la lista de alumnos
   * @param a "alumno de una materia"
   */
  public void addAlumno(Alumno a){
    alumnosInscriptos.add(a);
  }
	
  /**
   * Agrega una actividad a la lista de actividades
   * @param nuevaActividad "actividad de una materia"
   */
  public void addActividad(Actividad nuevaActividad){
	actividades.add(nuevaActividad);
  }
	
  /**
   * 
   * @param codigo "codigo de la materia"
   * @return u de tipo Materia
   * @throws userNotFound
   */
  public static Materia getMateriaByCodigo(String codigo) throws materiaNotFound {
    ResultSet rs = null;
	Materia u = null;
	rs = jpa.getByField("materia","cod_materia",codigo);
	try {
	  if (rs.next()) {
	    u = new Materia(rs.getInt(1),rs.getString(2),rs.getInt(3));
	  } 
	  else {
	    throw new materiaNotFound();
	  }
	} 
	catch (SQLException e) {
	  e.printStackTrace();
	}
	return u;
  }
	
  /**
   * Guarda y confirma la carga
   * @return true "si la materia es cargada correctamente"
   * @return false "si la materia no es cargada correctamente"
   */
  public boolean save() {
	try {
	  String codigo = Integer.toString(this.getCodigo());
	  Materia.getMateriaByCodigo(codigo);
	  return false;
	} 
	catch (materiaNotFound e1) {
	  String[] columns = { "cod_materia","nombre","dni"};
	  PreparedStatement stm = jpa.newRecord("educar_dev.materia",columns);
	  try {
	    stm.setInt(1,this.getCodigo());
		stm.setString(2,this.getNombre());
		stm.setInt(3,this.getDniResponsable());
	  } 
	  catch (SQLException e) {
	    e.printStackTrace();
		return false;
	  }
	  jpa.create(stm);
	  return true;
	}
  }
  
  /**
   * Guarda en un ArrayList las materias existentes
   * @return materias "lista de materias"
   * @throws SQLException
   */
  public static ArrayList<String> getMaterias()  throws SQLException{
    ResultSet rs = jpa.showAll("materia");
	ArrayList<String> materias = new ArrayList<String>(); 
	while (rs.next()) {
	  String cod_materia = Integer.toString(rs.getInt(1));
      materias.add("(" + cod_materia + ")  " + rs.getString(2));
	}
	return materias;
  }
  
  /**
   * Guarda en un ArrayLIst las materias dictadas por un docente
   * @return materias "lista de materias por docente"
   * @throws SQLException
   */
  public static ArrayList<String> getMateriasPorDocente()  throws SQLException{
    ResultSet codigosMaterias = jpa.showAll("materia");
    int dniUsuario = Session.getCurrentUser().getCode();
     ArrayList<Integer> codMaterias = new ArrayList<Integer> ();
     ArrayList<String> materias = new ArrayList<String> ();
     while (codigosMaterias.next()) {
       if(codigosMaterias.getInt(3) == dniUsuario)
         codMaterias.add(codigosMaterias.getInt(1));
       }
       for(int i=0; i<codMaterias.size();i++){
         try {
           String cod_materia = Integer.toString(codMaterias.get(i));
           String codigoYNombre = "";
           codigoYNombre = codigoYNombre + "(" + Integer.toString(Materia.getMateriaByCodigo(cod_materia).getCodigo()) + ")  ";
           codigoYNombre = codigoYNombre + Materia.getMateriaByCodigo(cod_materia).getNombre();
           materias.add(codigoYNombre);
         } 
         catch (materiaNotFound e) {}
         }
         return materias;
  }
  
  /**
   * Guarda en un ArrayList las materias en las que esta inscripta un alumno
   * @return materias "lista de materias por un alumno"
   * @throws SQLException
   */
  public static ArrayList<String> getMateriasPorAlumno() throws SQLException{ 
    ResultSet codigosMaterias = jpa.showAll("realizaDos");
    int dniUsuario = Session.getCurrentUser().getCode();
    ArrayList<Integer> codMaterias = new ArrayList<Integer> ();
    ArrayList<String> materias = new ArrayList<String> ();
    while (codigosMaterias.next()) {
      if(codigosMaterias.getInt(1) == dniUsuario)
        codMaterias.add(codigosMaterias.getInt(2));
      }
      for(int i=0; i<codMaterias.size();i++){
        try {
          String cod_materia = Integer.toString(codMaterias.get(i));
          String codigoYNombre = "";
          codigoYNombre = codigoYNombre + "(" + Integer.toString(Materia.getMateriaByCodigo(cod_materia).getCodigo()) + ")  ";
          codigoYNombre = codigoYNombre + Materia.getMateriaByCodigo(cod_materia).getNombre();
          materias.add(codigoYNombre);
        } 
        catch (materiaNotFound e) {}
        }
        return materias;
 }
  
  /**
   * Guarda en un ArayList los alumnos inscriptos en una materia
   * @param codigoMateria "codigo de materia"
   * @return alumnos "lista de alumnos que estan inscriptos en una materia"
   */
  public static ArrayList<Integer> getAlumnosPorMateria(String codigoMateria) {
    ResultSet codigosMaterias = jpa.showAll("realizaDos");
    ArrayList<Integer> alumnos = new ArrayList<Integer> ();
    try{
      while (codigosMaterias.next()) {
        if(Integer.toString(codigosMaterias.getInt(2)).equals(codigoMateria))
          alumnos.add(codigosMaterias.getInt(1));
        } 
    } 
    catch(SQLException e) {}
      return alumnos;
  }
  
  /**
   * Elimina una materia
   * @param table "nombre de la tabla"
   * @param column "nombre de la columna"
   * @param id "codigo de la materia"
   */
  public static void destroy(String table,String column,String id) {
    jpa.destroy(table,column,id); 
  }

  /**
   * Modifica el responsable de la materia	
   * @param nuevoDNI "dni de docente"
   */
  public void modificar(String nuevoDNI){
        jpa.update("materia","dni",nuevoDNI,"cod_materia",Integer.toString(this.getCodigo()));//***
  }
}
